package com.qf.modules.sys.service;

import com.qf.common.service.CrudService;
import com.qf.common.util.IdGen;
import com.qf.common.util.StringUtils;
import com.qf.modules.sys.entity.Menu;
import com.qf.modules.sys.mapper.MenuDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class MenuService extends CrudService<MenuDao, Menu> {
    protected DecimalFormat codeRuleFormat = new DecimalFormat("00000");

    /**
     * 树形菜单表
     * @param menu  菜单
     * @return  菜单集合
     */
    @Transactional(readOnly = false)
    public List<Menu> findList(Menu menu) {
        List<Menu> menuList = dao.findList(menu);
        Map<String, Menu> menuMap = new HashMap<>();

        // 首先，将所有菜单放入map中，方便后续查找
        for (Menu menuAll : menuList) {
            menuMap.put(menuAll.getId(), menuAll);
        }

        // 接下来，为每个菜单项找到其子菜单
        List<Menu> rootMenus = new ArrayList<>();
        for (Menu menuAll : menuList) {
            if ("-1".equals(menuAll.getParentId())) {
                // 功能菜单
                menuAll.setType("目录");
                rootMenus.add(menuAll);
            } else {
                Menu parent = menuMap.get(menuAll.getParentId());
                if (parent != null) {
                    if ("1".equals(menuAll.getParentId())){
                        // 顶级菜单
                        menuAll.setType("目录");
                    }else {
                        // 子菜单
                        menuAll.setType("菜单");
                        menuAll.setChildren(null);
                    }
                    parent.getChildren().add(menuAll);
                }
            }
        }
        return rootMenus.get(0).getChildren();
    }

    /**
     * 保存
     */
    @Transactional(readOnly = false)
    public void save(Menu menu) {
        if (StringUtils.stringIsNull(menu.getId())) {
            menu.setId(IdGen.uuid());
            menu.setIsNewRecord(true);

            // 获取指定父Id的最大内码
            String maxInnerCode = dao.getMaxInnerCode(menu.getParentId());
            if (StringUtils.stringIsNotNull(maxInnerCode)){
                // 0000100002 -> 00001、2 -> 0000100003
                String prefix = maxInnerCode.substring(0, maxInnerCode.length() - 5);
                String suffix = maxInnerCode.substring(maxInnerCode.length() - 5);
                menu.setInnerCode(prefix + codeRuleFormat.format(Integer.parseInt(suffix) + 1));
            } else {
                if ("-1".equals(menu.getParentId())) {
                    // 顶级菜单默认00001
                    menu.setInnerCode("00001");
                } else {
                    // 不是顶级菜单的二级菜单默认00001
                    Menu parentMenu = dao.get(menu.getParentId());
                    menu.setInnerCode(parentMenu.getInnerCode() + "00001");
                }
            }

            // 获取指定父Id的最大排序号
            Integer maxSort = dao.getMaxOrderNo(menu.getParentId());
            if (maxSort != null) {
                menu.setSort(maxSort + 1);
            } else {
                menu.setSort(1);
            }

            // 除了顶级菜单，设置父节点为非叶子节点
            if (!"-1".equals(menu.getParentId())) {
                dao.updateParentNotLeaf(menu.getParentId());
            }
        } else {
            Menu oldMenu = dao.get(menu.getId());
            menu.setInnerCode(oldMenu.getInnerCode());
            menu.setIsLeaf(oldMenu.getIsLeaf());
        }
        super.save(menu);
    }

    @Transactional(readOnly = false)
    public void delete(String id) {
        Menu entity = get(id);
        super.delete(entity);
    }
}
